﻿using System;
using System.Web;
using System.Web.Mvc;
using ToyStore.Domain.System;

namespace ToyStore.Web.Mvc.Authentication
{
	/// <summary>
	/// Atrybut sprawdzający uprawnienie do akcji na kontrolerze
	/// </summary>
	[AttributeUsage(AttributeTargets.Method)]
	public class AccessAttribute : AuthorizeAttribute
	{
		private readonly EnumRole[] _roles;

		/// <summary>
		/// Konstruktor - sprawdzanie jednej z wielu ról.
		/// </summary>
		/// <param name="roles">Role</param>
		public AccessAttribute(params EnumRole[] roles)
		{
			_roles = roles;
		}

		/// <summary>
		/// Sprawdzanie uprawnienia do akcji
		/// </summary>
		/// <param name="httpContext">Kontekst</param>
		/// <returns>Czy ma dostęp</returns>
		protected override bool AuthorizeCore(HttpContextBase httpContext)
		{
			if (httpContext == null)
				throw new ArgumentNullException("httpContext");

			// Make sure the user is authenticated.
			if (!httpContext.User.Identity.IsAuthenticated)
				return false;

			if (RightPrincipal.CurrentUser == null)
				return false;

			return RightPrincipal.CurrentPrincipal.HasRole(_roles);
		}

		/// <summary>
		/// Autoryzacja
		/// </summary>
		/// <param name="filterContext">Kontekst</param>
		public override void OnAuthorization(AuthorizationContext filterContext)
		{
			if (filterContext == null)
			{
				throw new ArgumentNullException("filterContext");
			}

			if (AuthorizeCore(filterContext.HttpContext))
			{
				// Posiada dostęp
			}
			else if (RightPrincipal.CurrentPrincipal == null)
			{
				// Niezalogowany
				filterContext.Result = new HttpUnauthorizedResult();
			}
			else
			{
				// Zalogowany brak uprawnień
				filterContext.HttpContext.Response.Redirect("~/Error");
			}
		}
	}
}